/*
Copyright [2012] [Maria Eugenia Malagamba]
Copyright [2012] [Leandro Pellegrino]
Copyright [2012] [Julia Gambuzzi]
Copyright [2012] [Ignacio Capodanno]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

#pragma once
#include <string>
#include "..\Parser\tinyXML\tinyxml.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>

using namespace std;

class ValoresParametrizablesBonus{

public:

	ValoresParametrizablesBonus(){
		
		HANDLE hMutex = CreateMutex(NULL, FALSE, TEXT("datosMutex"));
		DWORD dwWaitResult = WaitForSingleObject(hMutex, INFINITE); 

		if (dwWaitResult == WAIT_OBJECT_0){

			TiXmlDocument * documento = new TiXmlDocument();
			documento->LoadFile("bonus.xml", TIXML_ENCODING_UTF8);
		
			// bala
			TiXmlElement * bala = documento->FirstChildElement("bonus")->FirstChildElement("bala");
			this->bala_pathImagen = bala->Attribute("imagen");
			this->bala_poderDeDestruccion = atoi(bala->Attribute("poderDeDestruccion"));

			// bomba
			TiXmlElement * bomba = documento->FirstChildElement("bonus")->FirstChildElement("bomba");
			this->bomba_pathImagen = bomba->Attribute("imagen");
			this->bomba_poderDeDestruccion = atoi(bomba->Attribute("poderDeDestruccion"));
			this->bomba_radioDeExplosion = atoi(bomba->Attribute("radioExplosion"));
			this->bomba_duracion = atoi(bomba->Attribute("duracion"));
			this->bomba_velocidad = atoi(bomba->Attribute("velocidad"));
			this->bomba_probabilidad = atof(bomba->Attribute("probabilidad"));
		
			// mina
			TiXmlElement * mina = documento->FirstChildElement("bonus")->FirstChildElement("mina");
			this->mina_pathImagen = mina->Attribute("imagen");
			this->mina_poderDeDestruccion = atoi(mina->Attribute("poderDeDestruccion"));
			this->mina_probabilidad = atof(mina->Attribute("probabilidad"));

			// laser
			TiXmlElement * laser = documento->FirstChildElement("bonus")->FirstChildElement("laser");
			this->laser_pathImagen = laser->Attribute("imagen");
			this->laser_poderDeDestruccion = atoi(laser->Attribute("poderDeDestruccion"));
			this->laser_velocidad = atoi(laser->Attribute("velocidad"));
			this->laser_probabilidad = atof(laser->Attribute("probabilidad"));

			// misil
			TiXmlElement * misil = documento->FirstChildElement("bonus")->FirstChildElement("misil");
			this->misil_pathImagen = misil->Attribute("imagen");
			this->misil_poderDeDestruccion = atoi(misil->Attribute("poderDeDestruccion"));
			this->misil_velocidad = atoi(misil->Attribute("velocidad"));
			this->misil_probabilidad = atof(misil->Attribute("probabilidad"));

			// escudo
			TiXmlElement * escudo = documento->FirstChildElement("bonus")->FirstChildElement("escudo");
			this->escudo_pathImagen = escudo->Attribute("imagen");
			this->escudo_cantidadDeEnergia = atoi(escudo->Attribute("cantidadDeEnergia"));
			this->escudo_probabilidad = atof(escudo->Attribute("probabilidad"));

			// super escudo
			TiXmlElement * superEscudo = documento->FirstChildElement("bonus")->FirstChildElement("superEscudo");
			this->superEscudo_probabilidad = atof(superEscudo->Attribute("probabilidad"));

			// invisibilidad
			TiXmlElement * invisibilidad = documento->FirstChildElement("bonus")->FirstChildElement("invisibilidad");
			this->invisibilidad_ciclos = atoi(invisibilidad->Attribute("ciclos"));
			this->invisibilidad_probabilidad = atof(invisibilidad->Attribute("probabilidad"));

			// bomba de neutrones
			TiXmlElement * bombaDeNeutrones = documento->FirstChildElement("bonus")->FirstChildElement("bombaDeNeutrones");
			this->bombaDeNeutrones_probabilidad = atof(bombaDeNeutrones->Attribute("probabilidad"));

			delete documento;
			ReleaseMutex(hMutex);
		}else{
			// this shouldn't happen
			string error = "error";
		}
	}

	double getProbabilidadDe(int numeroBonus){
		// Recordemos que: 0 LASER | 1 MINA | 2 ESCUDO | 3 MISIL | 4 BOMBA | 5 NEUTRONES | 6 SUPERESCUDO | 7 INVISIBILIDAD
		switch(numeroBonus){
			case 0: return laser_probabilidad;
			case 1: return mina_probabilidad;
			case 2: return escudo_probabilidad;
			case 3: return misil_probabilidad;
			case 4: return bomba_probabilidad;
			case 5: return bombaDeNeutrones_probabilidad;
			case 6: return superEscudo_probabilidad;
			case 7:
			default:
				return invisibilidad_probabilidad;
		}
	}

	// bomba
	string bomba_pathImagen;
	int bomba_poderDeDestruccion;
	int bomba_radioDeExplosion;
	int bomba_duracion;
	int bomba_velocidad;
	int bomba_probabilidad;

	// mina
	string mina_pathImagen;
	int mina_poderDeDestruccion;
	int mina_probabilidad;

	// bala
	string bala_pathImagen;
	int bala_poderDeDestruccion;

	// laser
	string laser_pathImagen;
	int laser_poderDeDestruccion;
	int laser_velocidad;
	int laser_probabilidad;

	// misil
	string misil_pathImagen;
	int misil_poderDeDestruccion;
	int misil_velocidad;
	int misil_probabilidad;

	// escudo
	string escudo_pathImagen;
	int escudo_cantidadDeEnergia;
	int escudo_probabilidad;

	//super escudo
	int superEscudo_probabilidad;

	//invisibilidad
	int invisibilidad_ciclos;
	int invisibilidad_probabilidad;

	//bomba de neutrones
	int bombaDeNeutrones_probabilidad;

	virtual ~ValoresParametrizablesBonus(){}
};

